2213
14232
Я перелічую контакти з веб-служби та відображаю їх у списку контактів "section" tableView, як показано на скріншоті.
Проблема полягає в тому, що я отримую однакові значення тегів для прапорців першого рядка для розділу A, а також розділу S. Я відсортував один масив і відобразив у поданні індексованої таблиці. Як отримати різні значення тегів залежно від indexPath.row незалежно від кількості відображених розділів. Ось що я спробував
У комірціForRowAtIndexPath:
UIButton * checkBox;
якщо (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone)
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)];
}
ще
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)];
}
// int cnt = 0;
// for (int i = indexPath.section - 1; i> 0; i--)
// {
// cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters має символи від "A" до "Z"
//}
//checkBox.tag = cnt + indexPath.row;
[checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
[checkBox addTarget: самодіяльність: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
зворотна комірка;
}
- (void) checkBoxClicked: (id) відправник
{
CGPoint buttonPosition = [sender convertPoint: CGPointZero toView: self.tableViewContact];
NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition];
UIButton * tappedButton = (UIButton *) відправник;
NSLog (@ "Номер тегу =% d", [тег відправника]);
якщо ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]])
{
[відправник setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal];
якщо (indexPath! = Nil)
{
NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // зберігаємо ідентифікатори прапорців у mutableArrayOfIds
NSLog (@ "Ідентифікатор кнопки з позначкою тегом =% @", finalIntId);
[arrayOfIds addObject: finalIntId];
}
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag];
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row];
}
ще
{
[відправник setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
NSLog (@ "Не перевірено");
// [arrayOfIds removeObjectAtIndex: tappedButton.tag];
}
}
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section {
if ([arrayOfCharacters count] == ​​0)
{
повернути @ "";
}
повернути [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: section]];
}
- (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView
{
NSArray * toBeReturned = [масив NSArrayWithArray:
[@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # "
componentsSeparatedByString: @ "|"]];
повернутися доBeReturned;
}
- (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index
{
NSInteger count = 0;
для (символ NSString * у масивіOfCharacters) {
якщо ([символ isEqualToString: заголовок]) {
кількість повернень;
}
рахувати ++;
}
повернути 0;
}
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
повернення [arrayOfCharacters count];
// повернення 1;
}
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: розділ (NSInteger)
{
// повертаємо [mutableArray count];
повернути [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count];
} 
ви встановлюєте однакове значення тегу для всіх розділів, які мають однаковий рядок.
IndexPath має дві властивості, {section, row}.
Скажімо, розділ A має два рядки,
для row1 -> indexPath.section = 0, indexPath.row = 0;
для row2-> indexPath.section = 0, indexPath.row = 1;
Скажімо, розділ S має два рядки,
для row1 -> indexPath.section = 1, indexPath.row = 0;
для row2-> indexPath.section = 1, indexPath.row = 1;
Отже, для рядка1 розділу A та рядка1 розділу S ви встановлюєте одне і те ж значення тегу, яке дорівнює 0. Виникає ваша проблема.
Спробуйте встановити значення тегу, як показано нижче.
button.tag = indexPath.section * 1000 + indexPath.row;
при отриманні розділу та рядка,
Розділ NSInteger = (button.tag) / 1000;
NSInteger рядок = (button.tag)% 1000;
|
Спробуйте це...
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
статичний NSString * CellIdentifier = @ "Cell";
UITableViewCell * комірка = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if (комірка == нуль) {
комірка = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier];
}
UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)];
checkBox.backgroundColor = [UIColor orangeColor];
[checkBox addTarget: самодіяльність: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
зворотна комірка;
}
- (void) checkBoxClicked: (id) подія відправника: (id) подія
{
NSSet * дотики = [подія allTouches];
UITouch * touch = [торкається будь-якого об’єкта];
CGPoint currentTouchPosition = [сенсорне розташуванняInView: self.tv]; // тут телевізор - це об’єкт TableView
NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition];
NSLog (@ "значення indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row);
}
|
Це відбувається тому, що ви призначаєте тег кнопкам НЕЗАЛЕЖНО розділів.
В обох перших рядках розділів A & S є рядок = 0. тому Тег, призначений відповідній кнопці, дорівнює 0. Ви повинні призначити їм Зберігаючи посилання на свої розділи.
я б запропонував призначити підказку про доступність у формі, відокремленій комами, що містить Розділ, Рядок.
І у вашому методі
- (void) checkBoxClicked: (id) відправник
{
// вибираємо рядок із форми, розділеної комами. 1-й - це ваш розділ, 2-й - ряд.
}
другий варіант - робити все, що завгодно, і впровадити метод Button таким чином.
CGPoint buttonPosition = [sender convertPoint: CGPointZero toView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition];
якщо (indexPath! = нуль)
{
... indexpath.section - це ваш розділ, index path.row - ваш рядок.
}
Є і третій варіант.
в cellforRowAtIndexpath присвоїти вашій кнопці заголовок
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
[btn setTitle: <# Your Row #> forState: UIControlStateDisabled];
[btn setTag <# Ваш розділ #>];
тож при отриманні методом кнопки ви можете мати як розділ (тег), так і рядок (заголовок для стану інвалідів).
- (void) checkBoxClicked: (id) sender {[button titleForState: UIControlStateDisabled]; // ваш рядок
button.tag // ваш розділ}
|
Спробуйте це!
У кожному розділі ви можете знати кількість розділів праворуч, а потім додайте кількість окремих рядків.
[[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row
Де fieldTitlesList - це масив ваших розділів.
|
Я додав наступний код, який вирішив мою проблему
NSInteger rowNumber = 0;
для (NSInteger i = 0; i